/*
 * @Description: 
 * @Author: zoe
 * @Date: 2024-09-04 19:05:32
 * @LastEditors: rendc
 * @LastEditTime: 2024-09-05 15:09:28
 */
 
import java.util.Random;
import java.security.SecureRandom;
import java.util.Arrays;
import java.util.Scanner;
public class Zy {
    public static void main(String[] args) {
          //zy01();
          //zy02();
          //zy03();
          //zy04();
          //zy05();
          //zy06();
          //zy07();
          //zy08();
          //zy09();
          zy10();
    }
    public static void zy01(){
        //1. 使用多种不同方式创建数组并初始化，数组包含a、b、c三个元素
        String[] array1 = {"a","b","c"};
        char[] array2 = new char[]{'a','b','c'};
        String[] array3 = new String[]{"a","b","c"}; 
        System.out.println("array1:"+Arrays.toString(array1));  
        System.out.println("array2:"+Arrays.toString(array2));
        System.out.println("array3:"+Arrays.toString(array3));  
    }
    public static void zy02(){
        //2. 有数组 String[] arr = new String[]{"hello","world","!"}; 请遍历该数组并输出每个元素
        String[] arr = new String[]{"hello","world","!"};
        for(int i=0;i<arr.length;i++){
            System.out.println(arr[i]);
        }
    }
    public static void zy03(){
        //3. 求一个int[]数组的次大值 
        //根据数组的第一个和第二个元素的大小关系确定最大值和次大值从，
        //第三个元素开始依次比较和最大值、次大值的大小关系，确定是否需要改变最大值和次大值的值
        int[] arr = new int[]{1,233,125,6,7,8,9};
        int secondLargest = zy03_1(arr);
        System.out.println("secondLargest:"+secondLargest);
        zy03_1(arr); 
    }
    public static int zy03_1(int[] arr){     
        // 初始化最大值和次大值
        int max,secondMax;
        if(arr[0]>arr[1]){
            max = arr[0];
            secondMax = arr[1];
        }else{
            max = arr[1];
            secondMax = arr[0];
        }
        // 从第三个元素开始比较 
        for(int i=2;i<arr.length;i++){
            if(arr[i]>max){
                secondMax = max;
                max = arr[i];
            }else if(arr[i]>secondMax){
                secondMax = arr[i];
            }
        }
      return secondMax;  
    }
    public static void zy04(){
     //  4 数组内存考核：分析以下代码的运行结果，并画出代码对应的内存图
     // public class Test05_memory { 
     // public static void main(String[] args) { 
     // int[] arr1 = {1,2,3}; 
     // int[] arr2 = arr1; 
     // arr2[1] = 0; 
     // System.out.println("arr1: " + Arrays.toString(arr1)); 
     // System.out.println("arr2: " + Arrays.toString(arr2)); 
     // } 
     // }
     int[] arr1 = {1,2,3}; 
     int[] arr2 = arr1; 
     arr2[1] = 0; 
     System.out.println("arr1: " + Arrays.toString(arr1)); 
     System.out.println("arr2: " + Arrays.toString(arr2)); 
    }
    public static void zy05(){
        //5. 生成验证码：随机产生
        int length = 4;
        String verificationCode = zy05_1(4);
         System.out.println("verificationCode"+verificationCode);
         zy05_1(length);
    }
    public static String zy05_1(int length){
        //定义包含所有可能的字符串
        String allCharacters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
         // 创建随机数生成器
        SecureRandom random = new SecureRandom();
        // 创建字符数组用于存放生成的验证码字符
        char[] codeChar = new char[length];
        // 生成指定长度的验证码
        for (int i = 0; i < length; i++) {
            // 生成一个随机索引
            int index = random.nextInt(allCharacters.length());
            // 获取该索引对应的字符并放入数组
            codeChar[i] = allCharacters.charAt(index);
        }
        // 将字符数组转换为字符串并返回
        return new String(codeChar);
    }
    /*public static void zy06(){
        //  6.利用随机数生成生成一个长度为20的正整型数组。然后等待用户输入要查找的数字
        // 1.如果数组中包含用户输入数字，提示用户数字所在数组下标位置 
        // 2.如果数组中不包含用户输入数字，提示用户数据不存在 
        // 3.用户可以一直进行输入数字，如果用户输入-1，程序停止运行\
        //创建一个长度为20的正整形数组并用随机数填充
       int[] numbers = new int[20];
       Random random = new Random();
       for(int i = 0;i<numbers.length;i++){
       numbers[i] = random.nextInt(100);//设随机数范围在0-99
        }       
       // 输出验证
        System.out.println("随机生成的数组为："+Arrays.toString(numbers));
         //创建scanner读取
        Scanner scanner = new Scanner(System.in);
         //循环读取输入直到-1
        while(true){
            System.out.print("输入查找的数字(输入-1退出):");
            int target = scanner.nextInt();
            if(target == -1){
            break;//如果输入-1，跳出循环  
             }
            //找目标数字
            boolean find = false;
            for(int i = 0;i<numbers.length;i++){
            if(numbers[i] == target){
                System.out.println("数字"+target+"在数组中的位置是:"+i);
                find  = true;
                break;//找到了跳出循环    } }
            if(!find){
                System.out.println("数字"+target+"不在数组中的位置"); 
                }
            //关闭scanner
            scanner.close();
            System.out.println("程序退出");
            }
        }
    }*/
    public static void zy07(){
        //7. 统计次数  
        // 1. 产生100个[1,6]之间的随机数，并统计每个数字出现的概率 
        // 2. 可以创建2个数组分别保存随机数信息和统计产生次数信息 
        // 3. 例如：随机数生成了10个1，20个2，30个3，5个4，10个5，25个6，对应的 
        // 统计数组内容[10,20,30,5,10,25]，即统计数组的每一个位置上存放的是对应下标出现的次数 
              int[] randomNumbers = new int[100];//存放100个随机数
              int[] store = new int[6];//存放每个数字出现的次数
              //生成随机数
              Random random = new Random();
              for(int i = 0;i<randomNumbers.length;i++){
                int randomNumber = random.nextInt(6)+1; //生成1-6的随机数
                randomNumbers[i] = randomNumber;
                store[randomNumber-1]++;//更新计数数组
              }
              //输出每个数字出现的次数
              System.out.println("每个数字出现的次数:");
              for(int i = 0;i<store.length;i++){
                System.out.println((i+1)+":"+store[i]);
              }
              //计算每个数字出现的概率
               System.out.println("每个数字出现的概率:");
              for(int i = 0;i<store.length;i++){
                double probability = (double)store[i]/randomNumbers.length;
                System.out.printf("%d:%.2f%%\n",(i+1),probability*100);
              }
    } 
    public static void zy08(){
        //0
        int[] arr = {1,2,3,4,5,6,7,8,9,10};
        int target = 5;
        //调用函数查找目标值的位置
        boolean find = zy08_1(arr, target);
        //输出结果
        if(find){
            System.out.println("目标值"+target+"在数组中");
        }else{
            System.out.println("目标值"+target+"不在数组中");
        } 
        zy08_1(arr,target); 
    }  
    public static boolean zy08_1(int[] arr,int target){
        for(int i = 0;i < arr.length;i++){
            if(arr[i] == target){
                return true;
            }
        }
        return false;
    }
    public static void zy09(){
        // 9.查找数组中第一个大于给定值的元素
        // 给定一个整型数组和一个目标值，
        // 要求编写一个函数来查找数组中第一个大于给定值的元素。
        // 如果找到，则返回该元素的索引；如果未找到，则返回-1。
        //定义数组和目标值
        int arr[] = {1,2,3,4,5,6,7,8,9};
        int target = 5;
        //调用函数查找第一个大于目标值的元素
       int index = zy09_1(arr, target);
        //输出结果
        if(index != -1){
            System.out.println("第一个大于" +target+"的元素为:" +arr[index]);
        }else{
            System.out.println("未找到大于" +target+"的元素");
        }
        zy09_1(arr,target);
    }
    public static int zy09_1(int[] arr,int target){
        for(int i = 0;i < arr.length;i++){
            if(arr[i] > target){
                return i;
            }
        }
        return -1;
    }
    public static void zy10(){
        //10.描述什么情况下会出现空指针异常和索引越界异常并写代码验证。
         //空指针异常通常发生在尝试访问一个 null 引用的对象时。
         //索引越界异常通常发生在尝试访问数组中不存在的索引时。
        //  String str = null;
        //  System.out.println(str.length());
        int[] arr = {1, 2, 3, 4, 5};
        System.out.println(arr[5]);

    }
}          


